La caracterización de las muestras de agua se realiza a partir de los ensayos fisicoquímicos de laboratorio y las propiedades espectrales.
Los datos fisicoquímicos surgen de los ensayos de laboratorio y las mediciones in situ. A partir de productos satelitales se obtienen las reflectancias de superficie.
Con estos datos se generan una serie de figuras, que incluyen diagrama de caja y bigotes (boxplot), figuras de líneas, mapas de calor (heatmap) de correlaciones y figuras de dispersión.
Propiedades fisicoquímicas
Las propiedades fisicoquímicas de interés son: pH, conductividad, profundidad de disco de Secchi, sólidos suspendidos y turbidez.
Resulta de interés conocer la distribución espacial a través del río Paraná de estos valores, la correlación lineal entre parámetros y la diferencia de estas características entre ambas orillas.
Distribución espacial
Las propiedades fisicoquímicas se grafican en función de la longitud geográfica para comprender su distribución espacial. Se inicia con la definición de variables de apoyo.
Diferencio entre la última fecha de muestreo y todos los anteriores.
7
Agrego colores para destacar la última fecha disponible.
La generación de las figuras se lleva a cabo mediante una función personalizada, que itera entre todas las variables disponibles. Al ser una figura interactiva, se utiliza el paquete {ggiraph}[1] para incorporar esa funcionalidad.
La función f_figura_evolucion_lab tiene como argumento los parámetros de interés.
2
La figura incorpora líneas que unen las observaciones de la base de datos.
3
Se adicionan puntos por sobre las líneas.
4
Al pasar el mouse sobre los puntos de la figura se indica el valor del parámetro y la fecha de muestreo.
5
Arreglo el eje vertical.
6
Defino el eje horizontal e indico únicamente ambos lados de las orillas.
7
Agrego colores a líneas y puntos.
8
Características estéticas de la figura.
9
Se convierte la figura estática a interactiva.
10
Estilo del texto mostrado sobre los puntos.
11
Destaco la línea actual modificando la transparencia de las restantes.
12
Se aplica la función a todos los parámetros disponibles.
Correlatividad lineal entre parámetros
Se calculó el coeficiente de correlación lineal de Pearson para cada par de parámetros del agua, y su grado de significancia estadística. El paquete {corrr}[2] posee funciones que sirvieron para esta exploración.
Inicialmente se leen los datos y se definen variables de utilidad.
In [4]:
# leo los datos de laboratoriod <-read_csv("datos/base_de_datos_lab.csv",show_col_types =FALSE)# nombres de los parámetros y sus etiquetasparam_v <-c("ph", "cond", "sol_sus", "turb", "secchi")param_unid_v <-c("pH", "<i>cond</i>", "<i>susp</i>","<i>turb</i>", "<i>secchi</i>")names(param_unid_v) <- param_v
Remuevo valores repetidos del coeficiente, conservando únicamente los coeficientes inferiores de la matriz triangular.
Asimismo, se obtuvo el p-valor, definiendo un grado de confianza del 95%, por lo que una correlación estadísticamente significativa corresponde a p-valor <0,05.
Estilo de texto mostrado al pasar el mouse sobre la figura.
3
Para resaltar los parámetros mostrados, se aumenta la transparencia del resto de la figura.
Figuras identidad
Para acompañar el heatmap con los coeficientes de correlación lineal, se crearon figuras de dispersión entre pares de parámetros para visualizar dichas relaciones.
Se comienza con la lectura de los datos y la definición de variables de apoyo.
La profundidad de disco de secchi tiene una relación logarítmica con el resto de variables, por lo que los ejes deben ser modificados convenientemente, pero conservando la linealidad para el resto de parámetros.
Se crearon funciones personalizadas para modificar los ejes en caso de incluir en los pares de datos la profundidad de disco de Secchi.
La función f_guardar depende de ambos parámetros a comparar.
2
El nombre del archivo .png se compone a partir de ambos parámetros.
3
Se almacena cada figura según la combinación de pares de variables.
Distribución en orillas
Mediante figuras de boxplot se identifica si existen diferencias significativas entre orillas del río Paraná de las propiedades de interés.
Para ellos se leen los datos y se calcula la mediana de la longitud geográfica de los sitios de muestreo.
In [15]:
# parámetros y unidadesparam_v <-c("ph", "cond", "sol_sus", "turb", "secchi")param_unid_v <-c("pH","<i>cond</i> (μS/cm)","<i>susp</i> (ppm)","<i>turb</i> (NTU)","<i>secchi</i> (cm)")names(param_unid_v) <- param_v# leo base de datosd <-read_csv("datos/base_de_datos_lab.csv") |>filter(param !="hazemeter")# distingo dos grupos: lado Chaco y lado Corrientes# según la mediana de la longitud geográficam <-median(d$longitud)
Con la mediana se dividen los conjuntos de datos para cada parámetros. Se define si existe una diferencia significativa entre conjuntos a partir del test de Wilcox. Para facilitar el análisis, se crea una función personalizada.
In [16]:
f_lado_signif <-function(x) { d_chaco <- d |>mutate(lado =if_else( longitud >= m,"Corrientes","Chaco" ) ) |>filter(param == x & lado =="Chaco") |>pull(valor) d_corrientes <- d |>mutate(lado =if_else( longitud >= m,"Corrientes","Chaco" ) ) |>filter(param == x & lado =="Corrientes") |>pull(valor) signif <-wilcox.test( d_corrientes, d_chaco,paired =FALSE,exact =TRUE ) |> broom::tidy() |>select(p.value) |>mutate(es_significativo = p.value < .05 ) |>mutate(param = x )return(signif)}
Las figuras se generaron y almacenaron para cada variable.
Finalmente, se itera para todas las opciones posibles.
In [18]:
walk(param_v, f_figura_lado)
Propiedades espectrales
Las caracteráisticas espectrales de las muestras de agua se analizaron a fin de identificar cambios entre orillas sobre el río Paraná.
Firmas espectrales
La firma espectral es una figura que muestra el valor de la reflectancia de superficie (Rrs) para cada banda espectral, realizado por cada fecha de muestreo.
Se realizó la lectura de datos y se incorporaron las bandas espectrales en el orden adecuado.
Mediante una función personalizada se generaron las firmas espectrales para todas las fechas disponibles. Se incorporó características interactivas para destacar cada sitio muestral.
Para identificar cambios en los valores de Rrs se creó una figura boxplot que muestre la distribución entre bandas espectrales.
Se creó una transecta en el río Paraná a través de un vector lineal que sirvió para la extracción de Rrs, manteniendo las mismas posiciones. El valor final extraído correspondió con el promedio de una ventana de 3x3.
Inicialmente se lee el vector de la transecta, los recortes ráster y se calculan los valores medios por píxel.
In [23]:
v <-vect("vector/transecta.gpkg")# ráster de recortesarchivos_r <-list.files("recorte/",pattern ="tif$",full.names =TRUE)archivos_r <- archivos_r[!str_detect(archivos_r, "rsi")]fechas_r <-str_remove(basename(archivos_r), ".tif")lista_r <-map(.x = archivos_r, rast)# agrupo en ventana de 3x3lista_r3 <-map(lista_r, ~focal(.x, w =3, fun ="mean"))lista_r3 <-set_names(lista_r3, fechas_r)
Se agregaron las bandas espectrales y se realizó la extracción de los valores de píxel.
In [24]:
# factor de las bandasorden_bandas <-c("B01","B02","B03","B04","B05","B06","B07","B08","B8A","B11","B12")# reflectancias a lo largo de la transecta, por banda y fechae_tbl <-map(lista_r3, ~ terra::extract(.x, v, xy =TRUE)) |>list_rbind(names_to ="fecha") |>as_tibble() |>mutate(fecha =ymd(fecha)) |>pivot_longer(cols =starts_with("B"),values_to ="reflect",names_to ="banda" ) |>reframe(reflect =mean(reflect) /10000,y = y,.by =c(x, banda, fecha) ) |>mutate(banda =factor(banda, levels = orden_bandas))
La figura boxplot muestra la distribución de Rrs para todas las bandas espectrales.
A partir de tres sitios muestrales, orillas y mitad del río Paraná, se crearon boxplot que exploran la distribución espacial de reflectancia de superficie.
Se leyeron el vector de tres sitios muestrales, los recortes ráster y las banads espectrales.
In [27]:
# 3 puntos para extraer la reflectanciapuntos <-vect("vector/3puntos_transecta.gpkg")# ráster de recortesarchivos_r <-list.files("recorte/",pattern ="tif$",full.names =TRUE)archivos_r <- archivos_r[!str_detect(archivos_r, "rsi")]fechas_r <-str_remove(basename(archivos_r), ".tif")lista_r <-map(.x = archivos_r, rast)# agrupo en ventana de 3x3lista_r3 <-map(lista_r, ~focal(.x, w =3, fun ="mean"))lista_r3 <-set_names(lista_r3, fechas_r)# factor de las bandasorden_bandas <-c("B01","B02","B03","B04","B05","B06","B07","B08","B8A","B11","B12")
Con la extracción de los valores de reflectancias se creó una base de datos.
Para definir la significancia estadística entre conjuntos (orilla chaqueña, orilla correntina y mitad del río) se creó una función que calculó el coeficiente correspondiente al test Wilcox.
Una vez calculados todos los datos, se generó la figura final como paneles por banda espectral, mostrando tres boxplot e indicando su significancia estadística.